<#
.SYNOPSIS
将多个MP3文件合并为单个MP3文件

.DESCRIPTION
使用FFmpeg工具将多个MP3文件按顺序合并为一个输出文件。自动处理文件名格式、路径转义和临时文件清理。

.PARAMETER Files
要合并的MP3文件列表（位置参数）

.PARAMETER Output
输出文件名（支持别名 -o）
- 未指定时使用当前日期命名 (MMdd.mp3)
- 自动添加.mp3扩展名

.EXAMPLE
Merge-MP3Files song1.mp3 song2.mp3
合并两个文件，输出0813.mp3（当前日期）

.EXAMPLE
Merge-MP3Files part1.mp3 part2.mp3 -o combined
合并文件并输出combined.mp3

.EXAMPLE
Merge-MP3Files "track 01.mp3" "track 02.mp3" -o "full album"
合并带空格的文件名，输出full album.mp3

.NOTES
作者: CatLemon
版本: 1.0
依赖要求:
- 需要安装FFmpeg并添加到系统PATH
- 输入文件按命令行顺序合并
- 输出文件存在时自动覆盖
#>
function Merge-MP3Files {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory = $false, ValueFromRemainingArguments = $true)]
        [string[]]$Files,

        [Alias("o")]
        [string]$Output
    )

    # 处理输出文件名
    if (-not $Output) {
        $Output = (Get-Date -Format "MMdd") + ".mp3"
    }
    elseif (-not ($Output -match '\.mp3$')) {
        $Output = $Output + ".mp3"
    }

    # 验证输入文件
    if (-not $Files -or $Files.Count -eq 0) {
        Write-Error "No input files specified"
        return
    }

    # 创建临时文件
    $tempFile = [System.IO.Path]::GetTempFileName()
    $fileList = $Files | ForEach-Object {
        $fullPath = (Resolve-Path $_).Path
        $fullPath = $fullPath.Replace("'", "''")  # 转义单引号
        "file '$fullPath'"
    }
    $Utf8NoBomEncoding = New-Object System.Text.UTF8Encoding $False
    [System.IO.File]::WriteAllLines($tempFile, $fileList, $Utf8NoBomEncoding)

    try {
        # 执行FFmpeg合并
        ffmpeg -hide_banner -f concat -safe 0 -i "`"$tempFile`"" -c:a libmp3lame -q:a 2 "`"$Output`""
        if ($LASTEXITCODE -ne 0) {
            Write-Error "FFmpeg failed with exit code $LASTEXITCODE"
        }
        else {
            Write-Host "Successfully created: $Output" -ForegroundColor Green
        }
    }
    catch {
        Write-Error "FFmpeg execution error: $_"
    }
    finally {
        # 清理临时文件
        if (Test-Path $tempFile) { Remove-Item $tempFile -Force }
        if ($LASTEXITCODE -ne 0) { Remove-Item $Output -Force }
    }
}

Export-ModuleMember -Function Merge-MP3Files